package com.fruit.account.service.bill;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import com.fruit.mapper.account.bill.BillDetailMapper;
import com.fruit.pojo.account.bill.BillDetail;
import com.fruit.sdk.account.bill.BillDetailService;
import com.fruit.util.ResultInfo;
import com.fruit.util.ResultUtil;

/**
 * 账单明细相关服务
 * 
 * @author Administrator
 *
 */
@Service("billDetailService")
public class BillDetailServiceImpl implements BillDetailService {
	protected Logger logger = LoggerFactory.getLogger(BillDetailServiceImpl.class);
	@Autowired
	private BillDetailMapper billDetailMapper;
//	@Autowired
//	private BalanceDetailMapper balanceDetailMapper;
//	@Autowired
//	private CommissionDetailMapper commissionDetailMapper;
//	@Autowired
//	private UserAccountMapper userAccountMapper;
//	@Autowired
//	private BuyBackRuleMapper buyBackRuleMapper;
//	@Autowired
//	private UserManager userService;

	/**
	 * 批量插入账单明细
	 */
	@Override
	public Map<String, Object> insertBillForPayOnline(BillDetail record) {
		logger.info("【账单处理】---【开始】-----");
		Map<String, Object> result = new HashMap<String, Object>();
		//1、生成账单明细
		try {
			if (record != null) {
				logger.info("【账单处理】---【params】-----"+record.toString());
				if(record.getUserId()==null){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数用户id不能为空!"));
					return result;
				}
				if(record.getMoney()==null){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数金额不能为空!"));
					return result;
				}
				if(record.getObjId()==null){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数订单id不能为空!"));
					return result;
				}
				if(StringUtils.isEmpty(record.getMoneyState())){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数进出标识不能为空!"));
					return result;
				}
				if(record.getObjId()==null){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数对象id不能为空!"));
					return result;
				}
				if(StringUtils.isEmpty(record.getType())){
					result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数账单类型不能为空!"));
					return result;
				}
				try {
					//1、生成订购账单明细
					logger.info("【账单处理】---【保存订购账单】-----");
					billDetailMapper.insert(record);
				} catch (Exception e) {
					logger.error("【账单处理】---【生成订购账单异常】-----");
					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "插入账单明细异常！","","01"));
					return result;
				}
				logger.info("【账单处理】---【开始返销业务处理】-----");
//				//2、触发耳机分销（1.返销记录、2余额明细3更新余额4插入返销账单）
//				result = ((BillDetailServiceImpl)AopContext.currentProxy()).nestedCommissionBack(record);
//				ResultInfo rsu = (ResultInfo)result.get("result");
//				if(ResultInfo.SUCCESS.equals(rsu.getState())){
//					result.put("result", (ResultInfo)ResultUtil.initResult(rsu.getState(), "", "操作成功"));
//				}
				logger.info("【账单处理】---【返销业务处理结束】-----");
			} else {
				logger.error("【账单处理】---【传入参数异常】-----");
				result.put("result", ResultUtil.initResult(ResultInfo.ERROR, "param_error", "传入参数不能为空!"));
			}
			return result;
		} catch (Exception e) {
			logger.error("【账单处理】---【异常】-----"+ getStackTraceAsString(e));
			result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "未知错误！","","01"));
			return result;
		} finally {
			ResultInfo ri = (ResultInfo)result.get("result");
			if(ResultInfo.ROLLBACK.equals(ri.getIsRollBack())){
				logger.info("【账单处理】---【异常事务回滚】-----");
				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			}
			logger.info("【账单处理】---【开始】-----");
		}

	}
	/**
	 * 返销业务入口
	 * @param record
	 * @return
	 */
//	@SuppressWarnings("unchecked")
//	public Map<String, Object> nestedCommissionBack(BillDetail record) {
//		Map<String, Object> result = new HashMap<String, Object>();
//		logger.info("【返销处理】---【开始】-----");
//		try {
//			//1、触发耳机分销 获取返销规则
//			BuyBackRule recRule=new BuyBackRule();
//			recRule.setState("01");//已启用
//			recRule.setStartTime(DateUtil.getTime());
//			logger.info("【返销处理】---【获取返销规则】-----");
//			BuyBackRule bbRule=buyBackRuleMapper.selectByCondition(recRule);
//			if(bbRule!=null){//规则存在
//				//一级返销点数，二级返销点数如果获取不到，则不执行佣金返销功能
//				if(bbRule.getOneLevelRebate()==null|| bbRule.getOneLevelRebate()==null){
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "获取返销规则点数异常！","","01"));
//					return result;
//				}
//				//2、获取用户上下级   调用户中心的服务
//				Map<String,Object> userMap=null;
//				Map<String,Object> userData=null;
//				try {
//					logger.info("【返销处理】---【获取用户上下级】-----");
//					userMap=userService.getUserParent(record.getUserId());
//					if(userMap==null){
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "获取到用户上级失败","","01"));
//						return result;
//					}
//					ResultInfo userRi = (ResultInfo)userMap.get("result");
//					if(ResultInfo.ERROR.equals(userRi.getState())){
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "获取用户上级异常！","","01"));
//						return result;
//					}
//					userData=(Map<String, Object>) userMap.get("data");
//					if(userData==null||userData.size()<=0){
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.SUCCESS, "", "未匹配到当前用户的上级关系"));
//						return result;
//					}
//					logger.info("【返销处理】---【获取用户上下级id】-----"+userData.toString());
//				} catch (Exception e) {
//					logger.error("【返销处理】---【获取用户上下级异常】-----"+ getStackTraceAsString(e));
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "获取用户上级异常！","","01"));
//					return result;
//				}
//				
//				//3、生成返销记录
//				//构造佣金返销记录
//				List<CommissionDetail> Commlist=new ArrayList<CommissionDetail>();
//				try {
//					logger.info("【返销处理】---【构造佣金返销记录】---【开始】---");
//					if(StringUtils.isNotEmpty((String) userData.get("parentOne"))){
//						logger.info("【返销处理】---【构造佣金返销记录】---【当前用户上级id】-----"+(String) userData.get("parentOne"));
//						//构建一级级返销记录即一级返销
//						CommissionDetail commDetail=new CommissionDetail();
//						commDetail.setUserId(Integer.valueOf((String) userData.get("parentOne")));// 当前用户上级id
//						BigDecimal OneBackMoney=record.getMoney().multiply(new BigDecimal(bbRule.getOneLevelRebate())).divide(new BigDecimal(100),3,BigDecimal.ROUND_HALF_UP);
//						commDetail.setMoney(OneBackMoney.setScale(2, BigDecimal.ROUND_HALF_UP));// 更换为消费金额乘以返销点数
//						commDetail.setRebate(bbRule.getOneLevelRebate());//一级返销点数
//						commDetail.setOrderId(record.getObjId());//交易订单id
//						commDetail.setFriendId(record.getUserId());//一级返销为当前用户id
//						commDetail.setLevel("01");//01 一级；02二级
//						commDetail.setCreateTime(DateUtil.getTime());
//						commDetail.setRemark("一级返销");
//						Commlist.add(commDetail);
//					}
//					if(StringUtils.isNotEmpty((String) userData.get("parentTow"))){
//						logger.info("【返销处理】---【构造佣金返销记录】---【当前用户上级的上级id】-----"+(String) userData.get("parentTow"));
//						//构建上上级返销记录即二级返销
//						CommissionDetail commDetailP=new CommissionDetail();
//						commDetailP.setUserId(Integer.valueOf((String) userData.get("parentTow")));// 当前用户上上级id
//						BigDecimal twoBackMoney=record.getMoney().multiply(new BigDecimal(bbRule.getTwoLevelRebate())).divide(new BigDecimal(100),3,BigDecimal.ROUND_HALF_UP);
//						commDetailP.setMoney(twoBackMoney.setScale(2, BigDecimal.ROUND_HALF_UP));//消费金额乘以返销点数
//						commDetailP.setRebate(bbRule.getTwoLevelRebate());//二级返销点数
//						commDetailP.setOrderId(record.getObjId());//交易订单id
//						commDetailP.setFriendId(Integer.valueOf((String) userData.get("parentOne")));//二级返销为当前用户的上级id
//						commDetailP.setLevel("02");//01 一级；02二级
//						commDetailP.setCreateTime(DateUtil.getTime());
//						commDetailP.setRemark("二级返销");
//						Commlist.add(commDetailP);
//					}
//					if(Commlist.size()<=0){
//						logger.info("【返销处理】---【构造佣金返销记录】---【当前用户不存在上级】-----");
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "生成返销记录异常！"));
//						return result;
//					}
//					logger.info("【返销处理】---【构造佣金返销记录】---【saveparams】-----"+Commlist.toString());
//					//保存返销记录
//					commissionDetailMapper.insertCommissionDetails(Commlist);
//					logger.info("【返销处理】---【构造佣金返销记录】---【结束】-----");
//				} catch (Exception e) {
//					logger.error("【返销处理】---【构造佣金返销记录】---【生成返销记录异常！】-----"+ getStackTraceAsString(e));
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "生成返销记录异常！","","01"));
//					return result;
//				}
//				//4、生成返销记录账单明细
//				//构建返销记录账单明细
//				List<BillDetail> backBills=new ArrayList<BillDetail>();
//				try {
//					logger.info("【返销处理】---【返销记录账单明细】---【开始】-----");
//					for(CommissionDetail comm:Commlist){
//						//账单明细
//						BillDetail pBill=new BillDetail();
//						pBill.setUserId(comm.getUserId());
//						pBill.setType("02");//返销
//						pBill.setMoney(comm.getMoney());//返销金额
//						pBill.setMoneyState("01");//增加
//						pBill.setObjId(comm.getId());//返销记录id
//						pBill.setCreateTime(DateUtil.getTime());
//						pBill.setRemark(comm.getRemark());
//						backBills.add(pBill);
//					}
//					logger.info("【返销处理】---【返销记录账单明细】---【saveparams】-----"+backBills.toString());
//					if(backBills.size()<=0){
//						logger.info("【返销处理】---【返销记录账单明细】---【构建返销记录账单明细为空】-----");
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "生成返销记录入参异常！","","01"));
//						return result;
//					}
//					//保存返销记录账单明细
//					billDetailMapper.insertBillDetails(backBills);
//					logger.info("【返销处理】---【返销记录账单明细】---【结束】-----");
//				} catch (Exception e) {
//					logger.error("【返销处理】---【返销记录账单明细】---【生成返销记录账单明细异常！】-----"+ getStackTraceAsString(e));
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "生成返销记录账单明细异常！","","01"));
//					return result;
//				}
//				//构建修改用户余额
//				List<UserAccount> uList=new ArrayList<UserAccount>();
//				//5、生成余额明细
//				try {
//					logger.info("【返销处理】---【返销余额明细】---【开始】-----");
//					//构建返销余额明细
//					List<BalanceDetail> balancelist =new ArrayList<BalanceDetail>();
//					for(BillDetail bd:backBills){
//						//余额明细
//						BalanceDetail balance=new BalanceDetail();
//						balance.setUserId(bd.getUserId());
//						balance.setMoney(bd.getMoney());
//						balance.setIncomeState("01");//增加
//						balance.setBillId(bd.getId());
//						balance.setType("03");//返销
//						balance.setRemark(bd.getRemark());
//						balance.setCreateTime(DateUtil.getTime());
//						balancelist.add(balance);
//						
//						//用户账单余额
//						UserAccount uAccount=new UserAccount();
//						uAccount.setUserId(bd.getUserId());
//						uAccount.setBalance(bd.getMoney());//本次变动余额
//						uList.add(uAccount);
//					}
//					logger.info("【返销处理】---【返销余额明细】---【saveparams】-----"+balancelist.toString());
//					if(balancelist.size()<=0){
//						logger.info("【返销处理】---【返销余额明细】---【构建返销余额明细异常】-----");
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "构建返销余额明细异常！","","01"));
//						return result;
//					}
//					//保存余额明细
//					balanceDetailMapper.insertBalanceDetails(balancelist);
//					logger.info("【返销处理】---【返销余额明细】---【结束】-----");
//				} catch (Exception e) {
//					logger.error("【返销处理】---【返销余额明细】---【生成返销记录余额明细异常！】-----"+ getStackTraceAsString(e));
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "生成返销记录余额明细异常！","","01"));
//					return result;
//				}
//				
//				//6、修改用户账户余额
//				try {
//					logger.info("【返销处理】---【开始用户账户余额修改】---【saveparams】-----"+uList.toString());
//					if(uList.size()<=0){
//						logger.info("【返销处理】---【用户账户余额修改】---【构建参数异常】----");
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "更新用户账户余额入参异常！","","01"));
//						return result;
//					}
//					//修改用户账户余额
//					int rec=userAccountMapper.updateByUserIdBach(uList);
//					if(uList.size()!=rec){
//						logger.info("【返销处理】---【用户账户余额修改】---【更新用户账户余额失败！】----影响记录数：="+rec);
//						result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "更新用户账户余额异常！","","01"));
//						return result;
//					}
//					logger.info("【返销处理】---【用户账户余额修改】---【结束】-----");
//				} catch (Exception e) {
//					logger.error("【返销处理】---【用户账户余额修改】---【更新用户账户余额异常！】-----"+ getStackTraceAsString(e));
//					result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "更新用户账户余额异常！","","01"));
//					return result;
//				}
//				result.put("result", ResultUtil.initResult(ResultInfo.SUCCESS, "", "返销业务操作成功"));
//			}else{
//				result.put("result", ResultUtil.initResult(ResultInfo.SUCCESS, "", "未匹配到返销业务规则"));
//			}
//			return result;
//		} catch (Exception e) {
//			logger.error("【返销处理】---【异常】-----"+ getStackTraceAsString(e));
//			result.put("result", (ResultInfo)ResultUtil.initResult(ResultInfo.ERROR, "error", "获取分销规则异常！","","01"));
//			return result;
//		} finally {
//			ResultInfo ri = (ResultInfo)result.get("result");
//			if(ResultInfo.ROLLBACK.equals(ri.getIsRollBack())){
//				logger.info("【返销处理】---【异常事务回滚】-----");
//				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//			}
//			logger.info("【返销处理】---【结束】-----");
//		}
//	}
	/**
	 * 将ErrorStack转化为String.
	 */
	public static String getStackTraceAsString(Throwable ex) {
		StringWriter stringWriter = new StringWriter();
		ex.printStackTrace(new PrintWriter(stringWriter));
		return stringWriter.toString();
	}

}
